/*
 * Copyright (C) 2017-2021
 * All rights reserved, Designed By
 * Copyright authorization contact 18814114118
 */
package com.shop.cereshop.commons.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.shop.cereshop.commons.domain.express.HttpResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;

/**
 * 快递100商家寄件下单价格接口工具类
 * 接口地址：https://poll.kuaidi100.com/order/borderapi.do
 * 接口说明：商家寄件下单价格接口，用于查询寄件的预估费用
 */
@Slf4j
public class Kuaidi100SendOrderPriceUtil {

    /**
     * 请求参数（对应BOrderReq）
     */
    @Data
    public static class SendOrderPriceParam {
        /**
         * 快递公司编码，如：yunda, zhongtong, shunfeng, jd等
         */
        private String kuaidicom;
        
        /**
         * 寄件人姓名
         */
        private String sendManName;
        
        /**
         * 寄件人电话
         */
        private String sendManMobile;
        
        /**
         * 寄件人地址（打印地址）
         */
        private String sendManPrintAddr;
        
        /**
         * 收件人姓名
         */
        private String recManName;
        
        /**
         * 收件人电话
         */
        private String recManMobile;
        
        /**
         * 收件人地址（打印地址）
         */
        private String recManPrintAddr;
        
        /**
         * 重量（单位：kg）
         */
        private String weight;
        
        /**
         * 回调地址（可选）
         */
        private String callBackUrl;
    }

    /**
     * 响应结果
     */
    @Data
    public static class SendOrderPriceResponse {
        /**
         * 是否成功
         */
        private Boolean result;
        
        /**
         * 返回码
         */
        private String returnCode;
        
        /**
         * 返回消息
         */
        private String message;
        
        /**
         * 运费（单位：元）
         */
        private JSONObject data;
    }

    /**
     * 请求对象（对应PrintReq）
     */
    @Data
    private static class SendOrderPriceRequest {
        private String key;
        private String sign;
        private String t;
        private String param;
        private String method;
    }
    
    /**
     * 计算签名
     * 签名算法：MD5(param + t + key + secret).toUpperCase()
     * 
     * @param param 参数JSON字符串
     * @param t 时间戳
     * @param key 密钥
     * @param secret 密钥secret
     * @return 签名
     */
    private static String calculateSign(String param, String t, String key, String secret) {
        String signStr = param + t + key + secret;
        return DigestUtils.md5Hex(signStr).toUpperCase();
    }

    /**
     * 调用快递100商家寄件下单价格接口
     * 接口地址：https://poll.kuaidi100.com/order/borderapi.do
     * 
     * @param key 快递100密钥
     * @param secret 快递100密钥secret
     * @param param 请求参数（包含快递公司编码、寄件人信息、收件人信息、重量等）
     * @return 运费金额（单位：元），如果失败返回BigDecimal.ZERO
     */
    public static BigDecimal getSendOrderPrice(String key, String secret, SendOrderPriceParam param) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(secret) || param == null) {
            log.error("快递100商家寄件下单价格接口参数不完整");
            return BigDecimal.ZERO;
        }

        try {
            // 生成时间戳
            String t = String.valueOf(System.currentTimeMillis());
            
            // 构建param JSON字符串
            String paramJson = new Gson().toJson(param);
            
            // 计算签名：MD5(param + t + key + secret).toUpperCase()
            String sign = calculateSign(paramJson, t, key, secret);
            
            // 构建请求对象
            SendOrderPriceRequest request = new SendOrderPriceRequest();
            request.setKey(key);
            request.setSign(sign);
            request.setT(t);
            request.setParam(paramJson);
            request.setMethod("price"); // 商家寄件下单价格接口的method
            
            // 调用接口
            String url = "https://poll.kuaidi100.com/order/borderapi.do";
            HttpResult httpResult = HttpUtils.doPost(url, request);
            
            if (httpResult.getStatus() == 200 && StringUtils.isNotBlank(httpResult.getBody())) {
                SendOrderPriceResponse response = JSON.parseObject(httpResult.getBody(), SendOrderPriceResponse.class);
                
                if (response != null && response.getResult() != null && response.getResult()) {
                    // 接口调用成功，返回运费
                    if (StringUtils.isNotBlank(response.getData().getString("price"))) {
                        try {
                            return new BigDecimal(response.getData().getString("price"));
                        } catch (Exception e) {
                            log.error("解析运费金额失败: {}", response.getData().getString("price"), e);
                            return BigDecimal.ZERO;
                        }
                    } else {
                        log.warn("快递100商家寄件下单价格接口返回成功但运费为空");
                        return BigDecimal.ZERO;
                    }
                } else {
                    // 接口返回失败
                    String errorMsg = response != null ? response.getMessage() : "未知错误";
                    log.error("快递100商家寄件下单价格接口调用失败: {}", errorMsg);
                    return BigDecimal.ZERO;
                }
            } else {
                log.error("快递100商家寄件下单价格接口HTTP请求失败: status={}, body={}", 
                        httpResult.getStatus(), httpResult.getBody());
                return BigDecimal.ZERO;
            }
        } catch (Exception e) {
            log.error("调用快递100商家寄件下单价格接口异常", e);
            return BigDecimal.ZERO;
        }
    }
}

